﻿using FlyIL.Misc;
using FlyIL.Trace;
using System;
using System.Collections.Generic;

namespace FlyIL.Optimizer;



//[Obsolete]
//class XchgPass : SimplfyRoot
//{
//    MovPass mov_pass;

//    public override bool IsMatch(Context con, Inst node, ExpByTrace expression = null)
//        => (node.Value.Opt == Opt.xchg);

//    /// <summary>
//    /// xchg 的情况
//    /// </summary>
//    public override void Do(Context con, Inst node, ExpByTrace expression = null)
//    {

//        mov_pass ??= new MovPass();

//        var inst = node.Value;

//        /// 这里相当于 两个 mov 
//        var op0 = inst.O1;
//        var op1 = inst.O2;
//        var extR = con.TraceStrict(con.GetPreviousIfExist(node), ref op1);
//        var expL = con.TraceStrict(con.GetPreviousIfExist(node), ref op0);

//        var right = inst.O2;
//        inst.Opt = Opt.mov;
//        bool need_nop1 = (bool)(mov_pass.GetSubMatch(con, node) as MovPass)?.DoSimply(con, node, false, extR);

//        if (!need_nop1 && right != inst.O2)
//        {
//            con.InsertAfter(node).CopyFrom(inst);
//            node.mov(right, inst.O1);
//            bool bl = (bool)(mov_pass.GetSubMatch(con, node) as MovPass)?.DoSimply(con, node, true, expL);
//            if (bl)
//                node.nop();

//            return;
//        }


//        op0 = inst.O1; op1 = inst.O2;

//        node.mov(op1, op0);
//        right = inst.O2;
//        bool need_nop2 = (bool)(mov_pass.GetSubMatch(con, node) as MovPass)?.DoSimply(con, node, false, expL);
//        if (!need_nop2 && right != inst.O2)
//        {
//            con.InsertAfter(node).CopyFrom(inst);
//            node.mov(right, inst.O1);
//            con.RemoveDeadCode(node, ref inst.O1);

//            return;
//        }

//        inst.Opt = Opt.xchg;

//        if (need_nop1 && need_nop2)
//        {
//            node.nop();
//            con.RemoveDeadCode(node, ref op0);
//            con.RemoveDeadCode(node, ref op1);
//        }
//        else if (need_nop1)
//        {
//            node.mov(op1, op0);

//            (mov_pass.GetSubMatch(con, node) as MovPass)?.DoSimply(con, node);
//            con.RemoveDeadCode(node, ref op0);
//        }
//        else if (need_nop2)
//        {
//            node.mov(op0, op1);
//            (mov_pass.GetSubMatch(con, node) as MovPass)?.DoSimply(con, node);
//            con.RemoveDeadCode(node, ref op1);
//        }
//    }
//}


